import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class CreateInstance {
    public static void main(String[] args) {
        /*try {
            // step1 将要创建对象的 class 文件加载到内存
            Class<?> personClass = Class.forName("Person");

            // step2 调用无参构造器创建对象
            // Object person = personClass.newInstance();
            Person person = (Person) personClass.newInstance();

            // step3 使用对象
            System.out.println(person);
            person.setName("abc");
            person.setAge(18);
            System.out.println(person);

        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }*/

        try {
            // step1 将要创建对象的 class 文件加载到内存
            Class<?> personClass = Class.forName("Person");

            // step2 通过 getDeclaredConstructor 获取指定的构造器
            // 根本原因：方法的重载，参数的个数和参数的类型不同
            // 可以通过方法的重载条件判断选择使用的是哪个构造器
            Constructor<?> declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);
            // Object person = declaredConstructor.newInstance("abc", 18);
            Person person = (Person) declaredConstructor.newInstance("abc", 18);
            System.out.println(person);

        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
